package com.cetool.autocms.advice;

import com.cetool.autocms.common.BaseResponse;
import com.cetool.autocms.enumeration.SystemExceptionEnum;
import com.cetool.autocms.exception.ServiceException;
import com.cetool.autocms.util.BaseResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.stream.Collectors;

/**
 * 自定义全局异常处理
 *
 * @author 端木超群
 * @date 2021/11/05
 */
@Slf4j
@RestControllerAdvice
public class CustomExceptionHandler {
    /**
     * 校验异常处理
     *
     * @param methodArgumentNotValidException 方法参数校验异常
     * @return 响应实体
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public BaseResponse< Object > handleMethodArgumentNotValidException(
            MethodArgumentNotValidException methodArgumentNotValidException) {
        log.warn("系统参数校验异常，异常信息:", methodArgumentNotValidException);
        return BaseResponseUtil.fail(SystemExceptionEnum.PARAMETER_EMPTY_EXCEPTION.getExceptionCode(),
                methodArgumentNotValidException.getBindingResult().getFieldErrors().stream()
                        .map(FieldError::getDefaultMessage).collect(Collectors.joining(",")));
    }

    /**
     * 系统业务异常处理
     *
     * @param serviceException 自定义业务异常
     * @return 响应实体
     */
    @ExceptionHandler(ServiceException.class)
    public BaseResponse < Object > handleServiceException(ServiceException serviceException) {
        log.warn("系统业务逻辑异常，异常编码：{}，异常信息:{}", serviceException.getErrorCode(), serviceException.getMessage());
        return BaseResponseUtil.fail(serviceException.getErrorCode(), serviceException.getMessage());
    }

    /**
     * 系统数据访问异常处理
     *
     * @param dataAccessException 数据访问异常
     * @return 响应实体
     */
    @ExceptionHandler(DataAccessException.class)
    public BaseResponse < Object > handleDataAccessException(DataAccessException dataAccessException) {
        log.error("系统数据访问异常，异常信息：", dataAccessException);
        return BaseResponseUtil.fail(SystemExceptionEnum.DATA_ACCESS_EXCEPTION.getExceptionCode(),
                SystemExceptionEnum.DATA_ACCESS_EXCEPTION.getExceptionMsg());
    }

    /**
     * 系统异常处理
     *
     * @param exception 系统异常
     * @return 响应实体
     */
    @ExceptionHandler(Exception.class)
    public BaseResponse < Object > handleException(Exception exception) {
        log.error("系统异常，异常信息：", exception);
        return BaseResponseUtil.fail(SystemExceptionEnum.SYS_EXCEPTION.getExceptionCode(),
                SystemExceptionEnum.SYS_EXCEPTION.getExceptionMsg());
    }
}
